其他
Superset通过PostgreSQL 访问数据湖
Apache Superset 的官方 issue[1] 中有人问到,
我建了个 delta lake,并创建了几个表。现在我想从这些表读取数据,并在 Apache Superset 中创建仪表板。请问该怎么做。
Spark
参考 Delta Lake 中使用 Spark SQL DDL 和 DML 运行 Spark Thrift Server, 通过 jdbc+hive://
的方式连接, 如果有兴趣请留言,我回头整理一篇详细的使用教程。
Postgres
今天介绍的是通过 PL/Python 的方式来实现数据湖的访问, 关于 PL/Python 可以先看下我之前的两篇文章
另外建议看下
准备工作
安装好了 Postgres 以及 PL/Python
以鸢尾花数据(iris.csv)为例
本文使用的是 PostgreSQL 14 和 Python 3.9
安装所需 Python 包
pip install deltalake typing-extensions
不安装 typing-extensions
调用 delta lake 的时候会报错
(psycopg2.errors.ExternalRoutineException) ModuleNotFoundError: No module named 'typing_extensions'
代码示例
生成测试数据湖
import pandas as pd
iris = pd.read_csv('iris.csv')
from deltalake.writer import write_deltalake
write_deltalake( '/Users/steven/data/iris',iris)
创建数据湖读取函数
create or replace function read_iris(iris_path text)
returns table(sepal_length REAL,sepal_width REAL
,petal_length REAL,petal_width REAL
,species text)
as $$
from deltalake import DeltaTable
dt = DeltaTable(iris_path)
df= dt.to_pandas()
return df.values.tolist()
$$ language plpython3u;
使用 PL/Python 创建一个函数,返回类型为 iris table(4 个数字变量和一个字符串变量)
核心代码读取数据湖,并转为 DataFrame, 并输出该 DataFrame 的二维数组
测试函数
select * from read_iris('/Users/steven/data/iris');
基于函数创建视图
create or replace view iris as
select * from read_iris('/Users/steven/data/iris');
推荐创建物化视图
create materialized view iris1 as
select * from read_iris('/Users/steven/data/iris');
select count(*) from iris1;
-- 返回 150
更新数据湖
write_deltalake( '/Users/steven/data/iris',iris.head(),mode='overwrite')
更新物化视图之前
select count(*) from iris1;
-- 仍然返回 150
刷新物化视图
REFRESH MATERIALIZED VIEW iris1;
select * from iris1
-- 然后5条数据
Superset 通过 Postgres 连接访问创建好的视图和物化视图
Presto
熟悉该数据库的,也可以尝试下这个方案
参考资料
issue: https://github.com/apache/superset/issues/20758